<?php

    /*********************************************************************************
     * LeafPHP base基类 www.leafphp.com
     *-------------------------------------------------------------------------------
     * server、controller等类的基类，用于提供一些公共服务。
     *-------------------------------------------------------------------------------
     * $Author:hongshuaidong
     * $Dtime:2013-12-12
     ***********************************************************************************/
    
    if (!defined('__IS_LEAF__')) exit('Access Denied!');
    
    /**
     * 控制器、服务层层基类
     */
    class base {

        //定义dao属性
        private $daoArr     =   array( 'db', 'cache' );

        /**
         * 魔术方法，获取调用的属性，并解析，如果是Dao或Service，则实例化，其他情况调用Dao层的_daoGet
         */
        public function __get($call){
            //判断是否为userDao类型的调用，如果是，则进行dao实例化
            if( $this->isDao($call) ){
                return $this->instanceDao($call);
            }elseif( $this->isService($call) ){
            //判断是否为服务层service，如果是，则实例化service层
                return $this->instanceService($call);
            }else{
            //如果既不是要实例化dao也不是要实例化service，那么调用dao中的__get魔术方法
            }

        }

        /**
         * 判断被调用的属性其是否符合DAO调用，符合的类型如：db、cache等
         * @access private
         * @param string $call 被调用的属性
         */ 
        final protected function isDao($call){
            
            $return = false;
            if( in_array( $call, $this->daoArr ) ){
                $return = true;
            }
            return $return;

        }

        /**
         * 获取db类对象，如果是PDO，则实例化为PDO对象。
         * @access public
         * @return object 返回db类对象
         */ 
        final public function getDb(){

            return $this->instanceDao('db');

        }


        /**
         * 将通过检查的字符串实例化为Dao对象
         * @access protected
         * @param string $call 要实例化为Dao的字符串
         */
        final protected function instanceDao($call){
            
            switch ($call) {
                case 'db':
                    $dao = $this->db = pdoMy::getInstance();
                    break;
                
                default:
                    # code...
                    break;
            }
            return $dao;

        }

        /**
         * 判断是否为Service调用，符合类型如：userService，必须为Service结尾
         * @access protected
         * @param string $call 要实例化为Service的字符串
         */
        final protected function isService($call){
            $return = false;
            if(strlen($call)>3){
                //截取后三个字符，与Dao字符串比较
                $cmp = strcmp( substr($call, -7, 7), 'Service');
                if($cmp===0){
                    $return = true;
                }
            }
            return $return;
        }

        /**
         * 实例化服务层（也叫业务层）
         * @access protected
         * @param string $call 要实例化为Service的字符串
         */
        final protected function instanceService($call){
            //判断参数类型的合法性
            if(!is_string($call)) trigger_error(L('param').'$call'.L('must_string'), E_USER_ERROR);
            static $serviceInstances = array();
            //根据$call属性，获取表名
            if(isset($serviceInstances[$call])) return $serviceInstances[$call];
            $serviceInstances[$call] = new $call;
            return $serviceInstances[$call];
        }

        /**
         * 获取经过过滤的post数组或post数组中的元素，默认去除html标签
         * @access protected
         * @param mixed $input 获取安全的post数据的输入值
         */
        final protected function _post($input, $filter=false){

        }

        /**
         * 同方法_post
         * @access protected
         * @param mixed $input 获取安全的post数据的输入值
         */
        final protected function _get($input, $filter=false){
        }


    }
